Skip to content

注册日志 Skin - LogRegisterSkin

函数简介

全局注册一个自定义日志 Skin(回调输出目标)。成功时返回一个位枚举值,可与 OLA_LOG_TARGET_FILE / OLA_LOG_TARGET_CONSOLE 按位或后,通过 LogSetTarget 指定到某个日志实例。

回调类型见 OLALogSkinCallback

接口名称

LogRegisterSkin

DLL调用

c
int32_t LogRegisterSkin(int64_t instance, OLALogSkinCallback callback, int64_t userData);

参数说明

参数名类型说明
instance长整数型OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。
callback回调函数OLALogSkinCallback;不可为 NULL
userData长整数型透传给回调的上下文,可为 0。

返回值

返回值说明
> 0成功,为用户 Skin 位枚举(落在 0xFFFFFF00,即 bit8..bit31)。
0失败(callback 为空,或已满 24 个 Skin)。

推荐用法

  1. LogRegisterSkin 拿到 skin 枚举
  2. LogSetTarget(logger, FILE \| skin)(或仅 skin
  3. 写日志;回调收到 level / raw / formatted / userData
  4. 不再需要时 LogUnregisterSkin(skin)LogClearSkins

示例

SDK 调用

cpp
#include "OLAPlugServer.h"
#include <cstdio>

void OLA_CALL_TYPE OnUiLog(int32_t level, void* rawMessage, void* formattedMessage,
                           int64_t userData) {
    (void)userData;
    const char* raw = rawMessage ? (const char*)rawMessage : "";
    const char* formatted = formattedMessage ? (const char*)formattedMessage : "";
    std::printf("[UI] L=%d %s | %s\n", level, raw, formatted);
}

OLAPlugServer ola;
int skinUi = ola.LogRegisterSkin((int64_t)(void*)&OnUiLog, 0);
if (skinUi != 0) {
    long logger = ola.LogCreateInstance("UiLogger");
    ola.LogSetAsync(logger, 0);  // 测试时建议同步,便于立刻收到回调
    ola.LogSetTarget(logger, 1 | skinUi);  // FILE | skinUi
    ola.LogInfoEx(logger, "hello skin");
    ola.LogFlush(logger);
}
csharp
using System;
using System.Runtime.InteropServices;
using OLAPlug;

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
delegate void LogSkinCallback(int level, IntPtr rawMessage, IntPtr formattedMessage,
                              long userData);

void OnUiLog(int level, IntPtr rawMessage, IntPtr formattedMessage, long userData)
{
    string raw = Marshal.PtrToStringAnsi(rawMessage) ?? "";
    string formatted = Marshal.PtrToStringAnsi(formattedMessage) ?? "";
    Console.WriteLine($"[UI] L={level} {raw} | {formatted}");
}

var ola = new OLAPlugServer();
LogSkinCallback cb = OnUiLog;
int skinUi = ola.LogRegisterSkin(Marshal.GetFunctionPointerForDelegate(cb).ToInt64(), 0);
if (skinUi != 0)
{
    long logger = ola.LogCreateInstance("UiLogger");
    ola.LogSetAsync(logger, 0);
    ola.LogSetTarget(logger, 1 | skinUi);
    ola.LogInfoEx(logger, "hello skin");
    ola.LogFlush(logger);
    GC.KeepAlive(cb);
}
python
from OLAPlugServer import OLAPlugServer
# COM/脚本侧通常传入回调地址(int);具体封装以当前 SDK 为准
ola = OLAPlugServer()
skin = ola.LogRegisterSkin(callback_addr, 0)
if skin != 0:
    logger = ola.LogCreateInstance("UiLogger")
    ola.LogSetTarget(logger, 1 | skin)
    ola.LogInfoEx(logger, "hello skin")
java
import com.olaplug.OLAPlugServer;

OLAPlugServer ola = new OLAPlugServer();
// 回调地址按当前 Java SDK 约定传入
int skin = ola.LogRegisterSkin(callbackAddr, 0L);
if (skin != 0) {
    long logger = ola.LogCreateInstance("UiLogger");
    ola.LogSetTarget(logger, 1 | skin);
    ola.LogInfoEx(logger, "hello skin");
}
go
import "github.com/ola/olaplug/olaplug"

ola, _ := olaplug.NewOLAPlugServer("OLAPlug_x64.dll")
defer ola.ReleaseObj()
skin := ola.LogRegisterSkin(callbackAddr, 0)
if skin != 0 {
    logger := ola.LogCreateInstance("UiLogger")
    ola.LogSetTarget(logger, 1|skin)
    ola.LogInfoEx(logger, "hello skin")
}
rust
use olaplug::OLAPlugServer;

let ola = OLAPlugServer::new("OLAPlug_x64.dll").unwrap();
let skin = ola.log_register_skin(callback_addr, 0);
if skin != 0 {
    let logger = ola.log_create_instance("UiLogger");
    ola.log_set_target(logger, 1 | skin);
    ola.log_info_ex(logger, "hello skin");
}
cpp
var ola = com("OlaPlug.OlaSoft")
// 回调地址按 TC 封装约定传入
var skin = ola.LogRegisterSkin(callbackAddr, 0)
if(skin != 0) {
    var logger = ola.LogCreateInstance("UiLogger")
    ola.LogSetTarget(logger, 1 | skin)
    ola.LogInfoEx(logger, "hello skin")
}
vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
' 回调地址按插件封装约定传入
skin = ola.LogRegisterSkin(callbackAddr, 0)
If skin <> 0 Then
    logger = ola.LogCreateInstance("UiLogger")
    Call ola.LogSetTarget(logger, 1 Or skin)
    Call ola.LogInfoEx(logger, "hello skin")
End If
text
.局部变量 ola, OLAPlug
ola.创建 ()
skin = ola.LogRegisterSkin (回调地址, 0)
.如果真 (skin ≠ 0)
    logger = ola.LogCreateInstance (“UiLogger”)
    ola.LogSetTarget (logger, 位或 (1, skin))
    ola.LogInfoEx (logger, “hello skin”)
.如果真结束
aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var skin = ola.LogRegisterSkin(callbackAddr, 0);
if(skin != 0){
    var logger = ola.LogCreateInstance("UiLogger");
    ola.LogSetTarget(logger, 1 | skin);
    ola.LogInfoEx(logger, "hello skin");
}
text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
整数 skin = ola.LogRegisterSkin(回调地址, 0)
如果真 (skin ≠ 0)
{
    长整数 logger = ola.LogCreateInstance("UiLogger")
    ola.LogSetTarget(logger, 位或(1, skin))
    ola.LogInfoEx(logger, "hello skin")
}
cpp
#include "OLAPlugServer.h"

OLAPlugServer ola;
int32_t skin = ola.LogRegisterSkin((int64_t)(void*)&OnUiLog, 0);
if (skin != 0) {
    int64_t logger = ola.LogCreateInstance("UiLogger");
    ola.LogSetTarget(logger, 1 | skin);
    ola.LogInfoEx(logger, "hello skin");
}

原生 DLL 调用

cpp
#include "olaplug/ola_logger.h"

void OLA_CALL_TYPE OnUiLog(int32_t level, void* rawMessage, void* formattedMessage,
                           int64_t userData);

int32_t skin = LogRegisterSkin(instance, OnUiLog, 0);
LogSetTarget(instance, logger, OLA_LOG_TARGET_FILE | skin);
csharp
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern int LogRegisterSkin(long ola, long callback, long userData);

int skin = LogRegisterSkin(instance,
    Marshal.GetFunctionPointerForDelegate(cb).ToInt64(), 0);
python
from ctypes import CFUNCTYPE, c_int, c_int64, c_void_p, CDLL

LogSkinCb = CFUNCTYPE(None, c_int, c_void_p, c_void_p, c_int64)

@LogSkinCb
def on_ui_log(level, raw, formatted, user_data):
    pass

ola = CDLL("OLAPlug_x64.dll")
skin = ola.LogRegisterSkin(instance, on_ui_log, 0)

注意事项

项目说明
全局注册与 logger 句柄无关;多个 logger 可共用同一 Skin 位。
位分配1<<8 起,最多 24 个;LogUnregisterSkin 后该位可复用。
顺序LogRegisterSkinLogSetTarget;不可先写“未知 bit”。
级别过滤LogSetLevel 过滤的日志不会触发回调。
字符串编码回调字符串按 DefaultReturnEncoding(0=GBK / 1=UTF-8 / 2=Unicode)输出,与 API 返回字符串一致。
调用约定回调必须 OLA_CALL_TYPE(stdcall);x86/x64 双架构请统一声明。
进程内不跨进程转发回调指针。
COMCOM 侧 callback 一般为回调函数地址(int64)。

相关接口

接口说明
OLALogSkinCallback回调类型。
LogUnregisterSkin注销。
LogClearSkins清空全部。
LogSetTarget绑定到 logger。